AWS ELBとsecureモードCookieの挙動を調べてみた
はじめに
secureモードでない通常のCookieは、SSL/TLS による経路のセキュリティ保護を受けることが出来ません。 ELBでSSL終端する場合にsecureモードのCookieを利用できるか確認してみました。 検証の結果、Webサーバの種類(nginx,apache2.4)とELBの種類(ALB,CLB)に関係なく、利用出来ました。 secureモードのCookieについては、IPAのページををご覧下さい。
secureモードの動作確認
SSL/TLS 通信を使わないページでは、secureモードのCookieが送信されずセッションを作成出来ません。 テストコードを利用して、動作を確認しました。
secureモード無効時は、セッションが作成/維持される
まずは、secureモードが無効の時の動作を確認します。 EC2にhttpでアクセスします。 初めて接続すると「初回の訪問」と表示され、セッションが開始されます。
cookieを削除すると「初回の訪問」と表示されます。 再接続すると、新しいセッションIDが表示されます。
secureモード有効化
secureモードを有効にします。
php.iniにて、session.cookie_secure
を指定します。
$ diff /etc/php.ini /etc/php.ini.org 1365d1364 < session.cookie_secure = 1
secureモード有効時は、httpページでセッションを作成出来ない
EC2にhttpでアクセスします。 「初回の訪問」と表示されます。2回目以降の接続も同様です。 SSL/TLS 通信を使わないページでは、Cookieが送信されずセッションを作成出来ない事がわかります。
httpsページではセッションを作成できる
EC2に自己証明書を配置し、https接続します。
「初回の訪問 on」と表示されます。
"on"はテストコード中のgetenv('HTTPS')
の値です。HTTPSで接続する場合は"on"がセットされます。
2回目以降の接続では、IDが表示されます。 httpsページではセッションを作成できることがわかります。
ELB経由でのアクセスでは、セッションを作成できる
ELB経由でアクセスしてみます。
ELBのリスナーをhttpsとし、EC2にhttpでルーティングします。
https://ELBのDNS名
に接続し、テストコードの動作を確認します。
結果、Webサーバの種類(nginx/apache2.4)とELBの種類(ALB/CLB)に関係なく、セッションを作成出来ました。
nginx + php
セッションを作成/維持出来ます。 2回目以降のアクセスはセッションIDが表示されます。
apache2.4 + php
セッションを作成/維持出来ます。 2回目以降のアクセスはセッションIDが表示されます。
検証環境
nginx + php
- CentOS 7
- nginx.x86_64 1:1.10.3-1.el7.ngx
- php-common.x86_64 5.4.16-42.el7
- php-fpm.x86_64 5.4.16-42.el7
Apache2.4 + php
- CentOS 7
- httpd.x86_64 2.4.6-45.el7.centos
- php-common.x86_64 5.4.16-42.el7
- php-fpm.x86_64 5.4.16-42.el7
テストコード
<?php session_start(); ?> <html> <head><title>Session Test Page</title></head> <body> <?php if (!isset($_COOKIE["PHPSESSID"])){ print('初回の訪問'); } else{ print('セッションID: '.$_COOKIE["PHPSESSID"]); } $protocol = getenv('HTTPS'); ?> <?=$protocol?> </body> </html>
おわりに
ELBでSSL終端する場合にsecureモードのCookieを利用できるか確認しました。 今回の検証では、Webサーバの種類とELBの種類に関係なく利用出来ました。